<?php
/**
* 2017年5月22日 12:38:48
* author：silenceluo
* email：1095584081@qq.com
* 微信支付接口
*/

require_once(WECHAT_ROOT.'Config/Config.php');

class WechatPay
{
	//订单信息
	private $order;

	//请求主机名
	private $host = 'https://api.mch.weixin.qq.com/';

	//微信配置
	private $_config;
	
	//报错信息
	private $error;	

	
	function __construct($config)
	{
		$this->_config = $config;
	}

	/**
	 * 设置订单信息
	 * @param [type] $order [description]
	 */
	function setOrder($order)
	{
		$this->order = $order;
	}

	/**
	 * 检查订单信息
	 * @return [type] [description]
	 */
	function checkOrder()
	{
		if (!array_key_exists('details', $this->order))
		{
			$this->setError('请填写订单详情，下标为details');
			return FALSE;
		}

		if (!array_key_exists('body', $this->order))
		{
			$this->setError('请填写订单描述，下标为body');
			return FALSE;
		}

		if (!array_key_exists('total_price', $this->order))
		{
			$this->setError('请填写订单金额，下标为total_price');
			return FALSE;
		}

		if (!array_key_exists('openid', $this->order))
		{
			$this->setError('请填写下单人openid，下标为openid');
			return FALSE;
		}

		if (!array_key_exists('orderid', $this->order))
		{
			$this->setError('请填写订单号，下标为orderid');
			return FALSE;
		}

		return TRUE;
	}

	/**
	 * 设置错误提示
	 * @param string $error_msg [description]
	 */
	function setError($error_msg = '')
	{
		$this->error = array('code'=>0,'msg'=>$error_msg);
	}
		
	/**
	 * 获取错误信息
	 * @return [type] [description]
	 */
	function getError()
	{
		return $this->error;
	}

	/**
	 * 微信下单api
	 * @return [type] [description]
	 */
	function unifiedOrder()
	{	
		//设置下单请求地址
		$url = $this->host.'/pay/unifiedOrder';

		$request_data = array(

			'appid'				=>			$this->_config['appid'],		// 公众号账号id
			'mch_id'			=>			$this->_config['mch_id'],		// 商户号
			'nonce_str'			=>			generateNonceStr(),				// 随机字符串
			'body'				=>			$this->order['body'],			// 商品描述
			'details'			=>			$this->order['details'],		// 商品详情
			'out_trade_no'		=>			$this->order['orderid'],		// 商户订单号
			'total_fee'			=>			$this->order['total_price'],	// 总金额
			'spbill_create_ip'	=>			get_client_ip_server(),			// 终端ip
			'notify_url'		=>			$this->_config['callback'],		// 通知地址
			'trade_type'		=>			'JSAPI',						// 交易类型
			'openid'			=>			$this->order['openid'],			// 用户标识
			
			);

		$request_data['sign']	=	$this->getPaySign($request_data);

		$xml_data = xml_encode($request_data);
		
		//发送http请求
		$request = new Request();

		$response = $request->xmlCurlPost($xml_data, $url);

		$response = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
		
		return $response;
	}

	/**
	 * js发起支付请求参数获取
	 * @param  [type] $prepay_id [description]
	 * @return [type]            [description]
	 */
	function getJSBridge($prepay_id)
	{
		$data = array(
	            'appId'		=>		$this->_config['appid'],
	            'timeStamp' =>		time()."",
	            'nonceStr'	=>		generateNonceStr(),
	            'package'	=>		"prepay_id=".$prepay_id,//微信返回
	            'signType'	=>		"MD5",
	            );
		$data['sign'] = getPaySign($data);
		return $data;
	}


	/**
	 * 生成签名方法
	 * @param  [type] $arrdata [description]
	 * @return [type]          [description]
	 */
	function getSignature($arrdata) 
	{
		ksort($arrdata);
		$count = 0;//执行标记
		$paramstring = "";
		foreach($arrdata as $key => $value)
		{
			if(strlen($paramstring) == 0)
			{
				$paramstring .= $key . "=" . $value;
			}
			else
			{
				$paramstring .= "&" . $key . "=" . $value;
			}
		}

		$paramstring .= "&key=".$this->_config['key'];
		return $paramstring;
	}

	/**
	 * 获取支付签名
	 * @param  [type] $arrdata [description]
	 * @return [type]          [description]
	 */
	function getPaySign($arrdata)
	{
		$paraString = $this->getSignature($arrdata);
		return strtoupper( md5($paraString) );
	}
}